package com.qf.day15;

import java.util.ArrayList;

/**
 * 常见的异常
 * 受检异常
 * 运行时异常
 * Error
 */
public class ExceptionDemo02 {
    public static void main(String[] args) throws InterruptedException {

//        test1();
//        test2();
//
        // error
//        recursive();

        // 1TB大小的字节数组
//        byte[] bytes = new byte[1024*1024*1024*1024*1024];

        // 堆内存不足 error
        test3();

    }

    private static void test3() {
        // Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        //	at com.qf.day15.ExceptionDemo02.main(ExceptionDemo02.java:24)
        ArrayList<Object> objects = new ArrayList<>();

        for (;;) {
            // 创建10M大小的数组
            byte[] bytes = new byte[1024*1024*10]; // 垃圾收集，当堆内存空间不足时，会自动进行垃圾收集
            objects.add(bytes);  // 把数组对象放入集合中
        }
    }

    /**
     * Exception in thread "main" java.lang.StackOverflowError
     * 递归调用导致栈空间溢出
     * 栈空间大小默认为1M
     * 每次进行方法调用时，都需要消耗栈空间；如果方法正常退出，那么会归还使用的栈空间
     * StackOverflowError
     */
    public static void recursive(){
        System.out.println("recursive");
        recursive();
    }


    /**
     * 受检异常，checkedException
     * 编译器会强制我们处理这种类型的异常 ，
     * 处理的方式
     * (1)可以抛出
     * (2)try catch
     * @throws InterruptedException
     */
    private static void test2() throws InterruptedException {
        System.out.println("hello");
        Thread.sleep(3000); // 让当前线程休眠3秒钟
        System.out.println("wolrd");
    }

    /**
     * 运行时异常
     * 编译器不会强制我们处理他
     */
    private static void test1() {
        int a = 1/0;
    }
}
